package fangpian.leecode

/* 3. 无重复字符的最长子串 [中等偏上]

知识点：字符串/数组、滑动窗口、双指针

给定一个字符串 s ，请你找出其中不含有重复字符的 最长子串的长度。
*/
fun main() {
    // 补充完整
    fun lengthOfLongestSubstring(s: String): Int {
        // 记录字符上一次出现的位置，假设 ASCII 字符集
        val last = IntArray(128) { -1 }
        val n = s.length
        var left = 0 // 窗口开始位置
        var res = 0 // 最长不重复子串的长度
        for (right in 0 until n) {
            val index = s[right].code // 将字符转换为索引
            left = left.coerceAtLeast(last[index] + 1)
            res = res.coerceAtLeast(right - left + 1)
            last[index] = right
        }
        return res
    }

    println(lengthOfLongestSubstring("abcabcbb") == 3)
    println(lengthOfLongestSubstring("bbbbb") == 1)
    println(lengthOfLongestSubstring("pwwkew") == 3)
    println(lengthOfLongestSubstring("dvdf") == 3)
}